<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // Object.defineProperty() 直接在一个对象上定义一个新属性，或者修改一个对象的现有属性

    var obj = {age:0};

    // 属性描述符 configurable enumerable value writable get  set
    Object.defineProperty(obj,"age",{
        enumerable:false, //当enumerable为true 该属性才能出现在对象的for in循环中
        configurable:false, //删除不了该属性 该属性也不能重新定义描述符

        //当对当前属性发起访问时 拿到的值是其get方法返回的值
        get:function (){
            return this.__age__
        },
        //当对当前属性进行设置时 该属性对应的set方法就会被调用 set方法的第一个参数是最新的值
        set:function (val){
            if(val >100 || val<1){
                throw new Error("age 有问题")
            }else{
                //this : 当前属性所处的对象！
                this.__age__ = val
            }
        }
    })


    obj.age = 80

    console.log(obj);

</script>
</html>